#include <bits/stdc++.h>
using namespace std;

typedef long long ll;

struct node {
	ll to;
	ll nxt;
} e[200100];

struct Node {
	ll st, ed, p;
} d[200100];

ll n, m, q, tot;
ll head[100100];
ll a[100100];
ll dis[100100];
ll s1[400100];
ll s2[400100];
ll pre[100100];
ll nxt[100100];
ll p1[400100];
ll p2[400100];
bool inq[100100];
queue<ll> g;

inline void add(ll u, ll v) {
	tot++;
	e[tot].to = v;
	e[tot].nxt = head[u];
	head[u] = tot;
	return;
}

void build(ll l, ll r, ll idx) {
	if (l == r) {
		s1[idx] = a[l] - l;
		s2[idx] = a[l] + l;
		p2[idx] = 1e18;
	} else {
		ll mid = (l + r) >> 1;
		build(l, mid, idx << 1);
		build(mid + 1, r, idx << 1 | 1);
		s1[idx] = max(s1[idx << 1], s1[idx << 1 | 1]);
		s2[idx] = max(s2[idx << 1], s2[idx << 1 | 1]);
		p2[idx] = 1e18;
	}
	return;
}

ll q1(ll l, ll r, ll idx, ll L, ll R) {
	if (L <= l && r <= R) {
		return s1[idx];
	} else {
		ll mx = -1e18;
		ll mid = (l + r) >> 1;
		if (L <= mid) {
			mx = max(mx, q1(l, mid, idx << 1, L, R));
		}
		if (mid < R) {
			mx = max(mx, q1(mid + 1, r, idx << 1 | 1, L, R));
		}
		return mx;
	}
}

ll q2(ll l, ll r, ll idx, ll L, ll R) {
	if (L <= l && r <= R) {
		return s2[idx];
	} else {
		ll mx = -1e18;
		ll mid = (l + r) >> 1;
		if (L <= mid) {
			mx = max(mx, q2(l, mid, idx << 1, L, R));
		}
		if (mid < R) {
			mx = max(mx, q2(mid + 1, r, idx << 1 | 1, L, R));
		}
		return mx;
	}
}

int main() {
	freopen("shu.in", "r", stdin);
	freopen("shu.out", "w", stdout);
	scanf("%lld%lld%lld", &n, &m, &q);
	for (ll i = 1; i < n; i++) {
		ll u, v;
		scanf("%lld%lld", &u, &v);
		add(u, v);
		add(v, u);
	}
	for (ll i = 1; i <= q; i++) {
		scanf("%lld%lld%lld", &d[i].st, &d[i].ed, &d[i].p);
	}
	for (ll i = 1; i <= m; i++) {
		ll x, y;
		scanf("%lld%lld", &x, &y);
		a[x] = max(a[x], y);
	}
//	if (q <= 1000 && n <= 1000) {
		for (ll i = 1; i <= q; i++) {
			for (ll j = 1; j <= n; j++) {
				dis[j] = -1;
			}
			dis[d[i].st] = max(d[i].p, a[d[i].st]);
			g.push(d[i].st);
			inq[d[i].st] = 1;
			while (!g.empty()) {
				ll tt = g.front();
				inq[tt] = 0;
				g.pop();
				if (!dis[tt]) {
					continue;
				}
				for (ll j = head[tt]; j != 0; j = e[j].nxt) {
					ll v = e[j].to;
					ll xx = max(dis[tt] - 1, a[v]);
					if (dis[v] < xx) {
						dis[v] = xx;
						if (!inq[v]) {
							inq[v] = 1;
							g.push(v);
						}
					}
				}
			}
			if (dis[d[i].ed] != -1) {
				printf("YES\n");
			} else {
				printf("NO\n");
			}
		}
		return 0;
//	}
//	build(1, n, 1);
//	for (ll i = 1; i <= n; i++) {
//		nxt[i] = min(i + a[i], n);
//		pre[i] = max(i - a[i], 1ll);
//	}
	return 0;
}
